package com.dysm.load;

public class StringLoadTest {

    private static final String MSG = "aabb";

    public static void main(String[] args) {
        test1();
        test2();
    }

    private static void test1() {
        String a = "aa";
        String b = "bb";
        String c = "aa" + "bb";
        String d = a + b;

        System.out.println(c == MSG);
        System.out.println(d == MSG);
    }

    private static void test2() {

        // 先看字符串常量池中是否存在  "1"
        // 1、发现不存在，在堆中创建一个对象"1"(a)，将其引用放到字符串常量池
        // 2、同时会在堆中创建另一个对象"1"(b)，并返回引用给 s
        String s = new String("1");

        // 将 "1" 放入字符串常量池，因字符串常量池中已存在 "1"(a) ,相当于没有执行任何操作，但此时 s 仍然指向 堆中的对象(b)
        s.intern();

        // 将字符串常量池中的对象"1"(a)的引用 返回给 s2
        String s2 = "1";

        // 此时 s 指向堆中的对象"1"(b)，s2指向字符串常量池中的引用指向堆中的对象"1"(a)
        System.out.println(s == s2);//false

        // 堆中创建对象 "1","2","12"(c),将"12"(c)对象的引用返回给s3，注意此时并未将"12"(c)对象放入字符串常量池中
        String s3 = new String("1") + new String("2");

        // 将对象 "12"(c) 也就是 s3 的引用放入字符串常量池
        s3.intern();

        // 查询字符串常量池中是否存在字面量为 "12" 的字符串，发现已经存在，直接返回字符串常量池中的引用给s4
        String s4 = "12";

        // 所以s3跟s4都是指向堆中的同一个对象  "12"(c)
        System.out.println(s3 == s4);//true
    }
}
